水無瀬の部屋 > Programming > sample > atlnk > custom.cpp |
---|
1: //*********************************************************
2: // プロジェクト: atlnk - @link.target
3: // ファイル名: custom.cpp
4: //*********************************************************
5: #include "custom.h" //
6: #include "cmdline.h" //
7: #include "info.h" //
8: #include "res.h" //
9: #include <relation/relation.h> //
10: #include <misc/atoffset.h>
11: #include <header/myweburl.h> //
12: #include <dlg/aboutbox/aboutbox.h> //
13:
14:
15: //---------------------------------------------------------
16: // テスト関数 の 宣言
17: //---------------------------------------------------------
18: DECLARE_TESTPROC( test_InstallDlg );
19:
20:
21: //---------------------------------------------------------
22: // マクロ定数 の 定義
23: //---------------------------------------------------------
24: //
25: #define REG_CLS_FOLDER ( "folder" )
26: #define REG_KEYNAME_COMMAND ( "command" )
27: //
28: #define COLUMN_VERB ( 0 )
29: #define COLUMN_CMDLINE ( 1 )
30: #define COLUMN_WIDTH_VERB ( 60 )
31: #define COLUMN_WIDTH_CMDLINE ( 256 )
32: #define COLUMN_TITLE_VERB ( "verb" )
33: #define COLUMN_TITLE_CMDLINE ( "cmdline" )
34:
35:
36: //---------------------------------------------------------
37: // ファイルスコープ関数 の 宣言
38: //---------------------------------------------------------
39: static bool InitInstallDlgControls( HWND hWnd, DWORD more );
40: static bool SetInstallDlgData( HWND hWnd, const install_t *info );
41: static bool GetInstallDlgData( HWND hWnd, install_t *info );
42: static bool EnableDlgItemGroup( HWND hWnd, id_t id, bool bEnable );
43: static bool ShowDlgItemGroup( HWND hWnd, id_t id, bool bShow );
44: static int ListView_GetNextSelectedItem( HWND hwndListView, int index );
45: static bool InitInstallDlgSystemMenu( HWND hWnd );
46: static INT_PTR CALLBACK InstallDlgProc( HWND, UINT, WPARAM, LPARAM );
47:
48:
49: //---------------------------------------------------------
50: // ファイルスコープ変数 の 定義
51: //---------------------------------------------------------
52: //
53: static struct g_dlg_tag
54: {
55: bool pif;
56: DWORD more;
57: RECT rcClient;
58: SIZE szMinSize;
59: install_t info;
60: } g_dlg;
61:
62: //
63: static const struct g_ddx_tag
64: {
65: id_t id;
66: DWORD flag;
67: int check;
68: int more;
69: int reg;
70: int reg_title;
71: int menu;
72: int menu_title;
73: int cmdline;
74: int cmdline_title;
75: int list;
76: int list_title;
77: int group;
78: }
79: g_ddx[] =
80: {
81: #define MAKE_DDX( name ) { ID_ ## name, FLAG_ ## name, IDC_ ## name, IDC_MORE_ ## name, IDC_REGPATH_ ## name, IDC_STATIC_REGPATH_ ## name, IDC_MENUTITLE_ ## name, IDC_STATIC_MENUTITLE_ ## name, IDC_CMDLINE_ ## name, IDC_STATIC_CMDLINE_ ## name, IDC_VERBLIST_ ## name, IDC_STATIC_VERBLIST_ ## name, IDC_GROUP_ ## name }
82: MAKE_DDX( LNK ),
83: MAKE_DDX( PIF ),
84: #undef MAKE_DDX
85: };
86: COMPILE_ASSERT( numof(g_ddx) == numof( ((install_t *)null)->reg ) );
87:
88: // 各コントロールIDへのアクセス
89: static const size_t g_offset[] =
90: {
91: #define DDX_MEMBER_OFFSET( member ) offsetof( struct g_ddx_tag, member )
92: DDX_MEMBER_OFFSET( check ),
93: DDX_MEMBER_OFFSET( more ),
94: DDX_MEMBER_OFFSET( reg ),
95: DDX_MEMBER_OFFSET( reg_title ),
96: DDX_MEMBER_OFFSET( menu ),
97: DDX_MEMBER_OFFSET( menu_title ),
98: DDX_MEMBER_OFFSET( cmdline ),
99: DDX_MEMBER_OFFSET( cmdline_title ),
100: DDX_MEMBER_OFFSET( list ),
101: DDX_MEMBER_OFFSET( list_title ),
102: DDX_MEMBER_OFFSET( group ),
103: #undef DDX_MEMBER_OFFSET
104: };
105:
106:
107: //*********************************************************
108: // InstallDlg
109: // アプリケーションを拡張子に関連づける
110: //*********************************************************
111: bool
112: InstallDlg
113: (
114: HWND hwndOwner
115: )
116: {
117: CALLONCE_TESTPROC( test_InstallDlg ); // [テスト]
118:
119: // パラメタの仮定
120: ASSERT( !hwndOwner || IsValidWindow( hwndOwner ) );
121:
122: HINSTANCE hInstance = GetModuleHandle( null );
123: const INT_PTR result = DialogBoxParam
124: (
125: hInstance,
126: MAKEINTRESOURCE( INSTALL_BOX ),
127: hwndOwner,
128: InstallDlgProc,
129: null
130: );
131: return IDOK == result;
132: }//InstallDlg
133:
134:
135: //******************************************************************************************************************
136: //
137: //******************************************************************************************************************
138: static INT_PTR OnInstallInitDialog( HWND hWnd, WPARAM wParam, LPARAM lParam );
139: static INT_PTR OnInstallDestroy( HWND hWnd );
140: static INT_PTR OnInstallCommand( HWND hWnd, WPARAM wParam, LPARAM lParam );
141: static INT_PTR OnInstallSystemCommand( HWND hWnd, WPARAM wParam, LPARAM lParam );
142: static INT_PTR OnInstallInitMenuPopup( HWND hWnd, WPARAM wParam, LPARAM lParam );
143: static INT_PTR OnInstallHitTest( HWND hWnd, WPARAM wParam, LPARAM lParam );
144: static INT_PTR OnInstallGetMinMaxInfo( HWND hWnd, LPARAM lParam );
145: static INT_PTR OnInstallSize( HWND hWnd, WPARAM wParam, LPARAM lParam );
146: static INT_PTR OnInstallNotify( HWND hWnd, WPARAM wParam, LPARAM lParam );
147:
148:
149: //*********************************************************
150: // InstallDlgProc
151: //*********************************************************
152: static
153: INT_PTR
154: CALLBACK
155: InstallDlgProc
156: (
157: HWND hWnd,
158: UINT uMsg,
159: WPARAM wParam,
160: LPARAM lParam
161: )
162: {
163: // パラメタの仮定
164: ASSERT( IsValidWindow( hWnd ) );
165:
166: switch( uMsg )
167: {
168: case WM_DESTROY: return OnInstallDestroy( hWnd );
169: case WM_NCHITTEST: return OnInstallHitTest( hWnd, wParam, lParam );
170: case WM_INITDIALOG: return OnInstallInitDialog( hWnd, wParam, lParam );
171: case WM_COMMAND: return OnInstallCommand( hWnd, wParam, lParam );
172: case WM_SYSCOMMAND: return OnInstallSystemCommand( hWnd, wParam, lParam );
173: case WM_NOTIFY: return OnInstallNotify( hWnd, wParam, lParam );
174: case WM_GETMINMAXINFO: return OnInstallGetMinMaxInfo( hWnd, lParam );
175: case WM_SIZE: return OnInstallSize( hWnd, wParam, lParam );
176: case WM_INITMENUPOPUP: return OnInstallInitMenuPopup( hWnd, wParam, lParam );
177: default: return false;
178: }
179: }//InstallDlgProc
180:
181: //*********************************************************
182: // OnInstallInitDialog - WM_INITDIALOG
183: // ダイアログが作成された。
184: // この関数が抜けるまでダイアログは表示されない。
185: // 明示的にフォーカスを移動した場合は 真 を返せ。
186: // さもなくば 偽 を返せ。
187: // HWND wParam …… フォーカスを受け取る予定のコントロール
188: // LPARAM lParam …… ダイアログの初期化パラメタ
189: //*********************************************************
190: static
191: INT_PTR
192: OnInstallInitDialog
193: (
194: HWND hWnd,
195: WPARAM _unuse( wParam ),
196: LPARAM _unuse( lParam )
197: )
198: {
199: // パラメタの仮定
200: ASSERT( IsValidWindow( hWnd ) );
201: ASSERT( IsValidInitDialogMessageParam( wParam, lParam ) );
202:
203: // ダイアログ の 初期化
204: {
205: HINSTANCE hInstance = GetModuleHandle( null );
206: HICON hIcon = SHGetInstanceIcon( hInstance, SHGFI_LARGEICON );
207: HICON hIconSm = SHGetInstanceIcon( hInstance, SHGFI_SMALLICON );
208: SetWindowIcon( hWnd, ICON_BIG, hIcon ); // 大きいアイコン
209: SetWindowIcon( hWnd, ICON_SMALL, hIconSm ); // 小さいアイコン
210: VERIFY( WindowMoveToCursorPos( hWnd ) );
211:
212: // ダイアログ情報 g_dlg の 初期化
213: {
214: //
215: VERIFY( GetClientRect( hWnd, &g_dlg.rcClient ) );
216: VERIFY( GetWindowSize( hWnd, &g_dlg.szMinSize ) );
217:
218: //
219: VERIFY( LoadInstallInfo( &g_dlg.info ) );
220:
221: // 全ての詳細を隠す
222: g_dlg.more = 0;
223:
224: //
225: g_dlg.pif = (FLAG_PIF == (FLAG_PIF & g_dlg.info.flags));
226: }
227: }
228:
229: // システムメニュー の 初期化
230: VERIFY( InitInstallDlgSystemMenu( hWnd ) );
231:
232: // コントロール の 初期化
233: VERIFY( InitInstallDlgControls( hWnd, g_dlg.more ) );
234:
235: // コントロール値 の 設定
236: VERIFY( SetInstallDlgData( hWnd, &g_dlg.info ) );
237:
238: return false;
239: }//OnInstallInitDialog
240:
241: //*********************************************************
242: // OnInstallDestroy - WM_DESTROY
243: // まもなくウィンドウが破棄される。
244: // ウィンドウに関連付けた独自リソースを破棄する。
245: // 常に 真 を返す。
246: //*********************************************************
247: static
248: INT_PTR
249: OnInstallDestroy
250: (
251: HWND _unuse( hWnd )
252: )
253: {
254: // パラメタの仮定
255: ASSERT( IsValidWindow( hWnd ) );
256:
257: return true;
258: }//OnInstallDestroy
259:
260: //*********************************************************
261: // OnInstallHitTest - WM_NCHITTEST
262: // カーソル・イベントがあるたびに呼び出される。
263: // カーソルが存在する位置を示す値を返す。
264: // GET_X_LPARAM( lParam ) …… カーソルのスクリーン x 座標
265: // GET_Y_LPARAM( lParam ) …… カーソルのスクリーン y 座標
266: //*********************************************************
267: static
268: INT_PTR
269: OnInstallHitTest
270: (
271: HWND hWnd,
272: WPARAM wParam,
273: LPARAM lParam
274: )
275: {
276: // パラメタの仮定
277: ASSERT( IsValidWindow( hWnd ) );
278:
279: // サイズ変更矢印の変換ルール一覧
280: const struct { LRESULT from; LRESULT to; } trans[] =
281: {
282: { HTCLIENT, HTCAPTION }, // クライアント領域を掴んで移動可能に
283: { HTTOP, HTBORDER }, // 上端の縦矢印 → 矢印なし
284: { HTBOTTOM, HTBORDER }, // 下端の縦矢印 → 矢印なし
285: { HTTOPLEFT, HTLEFT }, // 左上隅の斜め矢印 → 左右矢印
286: { HTTOPRIGHT, HTRIGHT }, // 右上隅の斜め矢印 → 左右矢印
287: { HTBOTTOMLEFT, HTLEFT }, // 左下隅の斜め矢印 → 左右矢印
288: { HTBOTTOMRIGHT, HTRIGHT }, // 右下隅の斜め矢印 → 左右矢印
289: };
290: // 変換一覧にあれば変換した値を返す
291: const LRESULT lResult = DefWindowProc( hWnd, WM_NCHITTEST, wParam, lParam );
292: {for( int i = 0; i < numof( trans ); ++i )
293: {
294: if ( lResult == trans[ i ].from )
295: {
296: SetWindowLongPtr64( hWnd, DWL_MSGRESULT, trans[ i ].to );
297: return true;
298: }
299: }}
300:
301: return false;
302: }//OnInstallHitTest
303:
304: //*********************************************************
305: // OnInstallInitMenuPopup - WM_INITMENUPOPUP
306: // ポップアップ・メニューがアクティブになる。
307: // HMENU wParam …… メニューへのハンドル
308: // UINT LOWORD(lParam) …… 親メニュー座標での 0 からの相対位置
309: // bool HIWORD(lParam) …… システムメニューであれば 真
310: //*********************************************************
311: static
312: INT_PTR
313: OnInstallInitMenuPopup
314: (
315: HWND hWnd,
316: WPARAM wParam,
317: LPARAM _unuse( lParam )
318: )
319: {
320: // パラメタの仮定
321: ASSERT( IsValidWindow( hWnd ) );
322: ASSERT( IsValidInitMenuPopupMessageParam( wParam, lParam ) );
323:
324: // メニュー
325: HMENU hmenuPopup = reinterpret_cast<HMENU>( wParam );
326: Menu_CheckItem( hmenuPopup, IDM_USE_PIF, MF_BYCOMMAND, g_dlg.pif );
327:
328: return true;
329: }//OnInstallInitMenuPopup
330:
331: //*********************************************************
332: // OnInstallGetMinMaxInfo
333: //*********************************************************
334: static
335: INT_PTR
336: OnInstallGetMinMaxInfo
337: (
338: HWND hWnd,
339: LPARAM lParam
340: )
341: {
342: // パラメタの仮定
343: ASSERT( IsValidWindow( hWnd ) );
344: ASSERT( IsValidPtr( (MINMAXINFO *)lParam, sizeof(MINMAXINFO) ) );
345:
346: //
347: MINMAXINFO *pmmi = (MINMAXINFO *)lParam;
348:
349: //
350: pmmi->ptMinTrackSize.y = g_dlg.szMinSize.cy;
351: pmmi->ptMaxTrackSize.y = g_dlg.szMinSize.cy;
352:
353: //
354: pmmi->ptMinTrackSize.x = ((0 != g_dlg.more) ? 2 : 1) * g_dlg.szMinSize.cx;
355:
356: //
357: if ( 0 == g_dlg.more )
358: {
359: pmmi->ptMaxTrackSize.x = g_dlg.szMinSize.cx;
360: }
361:
362: return true;
363: }//OnInstallGetMinMaxInfo
364:
365: //*********************************************************
366: // OnInstallSize
367: //*********************************************************
368: static
369: INT_PTR
370: OnInstallSize
371: (
372: HWND hWnd,
373: WPARAM wParam,
374: LPARAM lParam
375: )
376: {
377: // パラメタの仮定
378: ASSERT( IsValidWindow( hWnd ) );
379:
380: // 最小化時は無視
381: if ( SIZE_MINIMIZED == wParam )
382: return true;
383:
384: // 移動とサイズ変更のリスト
385: const struct
386: {
387: int nID;
388: bool pos_x;
389: bool pos_y;
390: bool size_x;
391: bool size_y;
392: }
393: ctrl[] =
394: {
395: // { IDC_LNK, false, false, false, false },
396: { IDC_MORE_LNK, true, false, false, false },
397: { IDC_REGPATH_LNK, false, false, true, false },
398: { IDC_MENUTITLE_LNK, false, false, true, false },
399: { IDC_CMDLINE_LNK, false, false, true, false },
400: { IDC_VERBLIST_LNK, false, false, true, false },
401: { IDC_GROUP_LNK, false, false, true, false },
402: // { IDC_PIF, false, false, false, false },
403: { IDC_MORE_PIF, true, false, false, false },
404: { IDC_REGPATH_PIF, false, false, true, false },
405: { IDC_MENUTITLE_PIF, false, false, true, false },
406: { IDC_CMDLINE_PIF, false, false, true, false },
407: { IDC_VERBLIST_PIF, false, false, true, false },
408: { IDC_GROUP_PIF, false, false, true, false },
409: { IDOK, true, false, false, false },
410: { IDCANCEL, true, false, false, false }
411: };
412: HDWP hdwp = BeginDeferWindowPos( numof(ctrl) );
413: if ( hdwp )
414: {
415: const int width = LOWORD(lParam);
416: const int height = HIWORD(lParam);
417: const int shift_x = width - g_dlg.rcClient.right;
418: const int shift_y = height - g_dlg.rcClient.bottom;
419: {for( int i = 0; i < numof(ctrl); ++i )
420: {
421: ASSERT( IsValidDlgItem( hWnd, ctrl[ i ].nID ) );
422: VERIFY( ShiftDeferDlgItem
423: (
424: &hdwp,
425: hWnd,
426: ctrl[i].nID,
427: ctrl[i].pos_x ? shift_x : 0,
428: ctrl[i].pos_y ? shift_y : 0,
429: ctrl[i].size_x ? shift_x : 0,
430: ctrl[i].size_y ? shift_y : 0
431: ) );
432: }}
433: VERIFY( EndDeferWindowPos( hdwp ) );
434:
435: g_dlg.rcClient.right = width;
436: g_dlg.rcClient.bottom = height;
437: }
438: return true;
439: }//OnInstallSize
440:
441:
442: //******************************************************************************************************************
443: // OnInstallCommand - WM_COMMAND
444: //******************************************************************************************************************
445: static INT_PTR OnInstallCommandOK( HWND hWnd );
446: static INT_PTR OnInstallCommandCancel( HWND hWnd );
447: static INT_PTR OnInstallCommandDefault( HWND hWnd, WPARAM wParam );
448: static INT_PTR OnInstallCommandCheck( HWND hWnd, WPARAM wParam );
449: static INT_PTR OnInstallCommandMore( HWND hWnd, WPARAM wParam );
450:
451:
452: //*********************************************************
453: // OnInstallCommand - WM_COMMAND
454: // コマンド項目が選択された。
455: // 返値の意味は要求されたコマンド項目による。
456: // LOWORD(wParam) …… 選択されたコマンド項目の識別子。
457: // メニューの区切り線が選択された場合は 0 が設定される。
458: // HIWORD(wParam) …… 通知コード。
459: // メッセージが メニュー から送信された場合は 0 が設定される。
460: // メッセージがアクセラレータから送信された場合は 1 が設定される。
461: // HWND lParam …… メッセージがコントロールから送信された場合はメッセージを送信したコントロールのハンドル。
462: //
463: //*********************************************************
464: static
465: INT_PTR
466: OnInstallCommand
467: (
468: HWND hWnd,
469: WPARAM wParam,
470: LPARAM _unuse( lParam )
471: )
472: {
473: // パラメタの仮定
474: ASSERT( IsValidWindow( hWnd ) );
475: ASSERT( IsValidCommandMessageParam( wParam, lParam ) );
476:
477: switch( LOWORD( wParam ) )
478: {
479: case IDOK: return OnInstallCommandOK( hWnd );
480: case IDCANCEL: return OnInstallCommandCancel( hWnd );
481: default: return OnInstallCommandDefault( hWnd, wParam );
482: }
483: }//OnInstallCommand
484:
485: //*********************************************************
486: // OnInstallCommandOK
487: //*********************************************************
488: static
489: INT_PTR
490: OnInstallCommandOK
491: (
492: HWND hWnd
493: )
494: {
495: // パラメタの仮定
496: ASSERT( IsValidWindow( hWnd ) );
497:
498: //
499: install_t info; // 設定値
500: if ( ! GetInstallDlgData( hWnd, &info ) )
501: {
502: return false;
503: }
504: ASSERT( IsValidInstallInfo( &info ) );
505:
506: // 関連づけ
507: const DWORD modified = GetModifiedFlags( &info, &g_dlg.info );
508: VERIFY( SaveInstallInfo( &info, modified ) );
509:
510: //
511: VERIFY( EndDialog( hWnd, IDOK ) );
512:
513: return true;
514: }//OnInstallCommandOK
515:
516: //*********************************************************
517: // OnInstallCommandCancel
518: //*********************************************************
519: static
520: INT_PTR
521: OnInstallCommandCancel
522: (
523: HWND hWnd
524: )
525: {
526: // パラメタの仮定
527: ASSERT( IsValidWindow( hWnd ) );
528:
529: VERIFY( EndDialog( hWnd, IDCANCEL ) );
530:
531: return true;
532: }//OnInstallCommandCancel
533:
534: //*********************************************************
535: // OnInstallCommandDefault
536: //*********************************************************
537: static
538: INT_PTR
539: OnInstallCommandDefault
540: (
541: HWND hWnd,
542: WPARAM wParam
543: )
544: {
545: // パラメタの仮定
546: ASSERT( IsValidWindow( hWnd ) );
547:
548: {for( int i = 0; i < numof( g_ddx ); ++i )
549: {
550: const int id = LOWORD( wParam );
551:
552: if ( id == g_ddx[ i ].check )
553: return OnInstallCommandCheck( hWnd, wParam );
554: if ( id == g_ddx[ i ].more )
555: return OnInstallCommandMore( hWnd, wParam );
556: }}
557:
558: return false;
559: }//OnInstallCommandDefault
560:
561: //*********************************************************
562: // OnInstallCommandCheck
563: //*********************************************************
564: static
565: INT_PTR
566: OnInstallCommandCheck
567: (
568: HWND hWnd,
569: WPARAM wParam
570: )
571: {
572: // パラメタの仮定
573: ASSERT( IsValidWindow( hWnd ) );
574:
575: //
576: {for( int i = 0; i < numof( g_ddx ); ++i )
577: {
578: if ( g_ddx[ i ].check == LOWORD( wParam ) )
579: {
580: const bool bEnable = (BST_CHECKED == IsDlgButtonChecked( hWnd, g_ddx[ i ].check ));
581: EnableDlgItemGroup( hWnd, g_ddx[ i ].id, bEnable );
582: return true;
583: }
584: }}
585:
586: UNREACHCODE( "g_ddx の抜け?" );
587: return true;
588: }//OnInstallCommandCheck
589:
590: //*********************************************************
591: // OnInstallCommandMore
592: //*********************************************************
593: static
594: INT_PTR
595: OnInstallCommandMore
596: (
597: HWND hWnd,
598: WPARAM wParam
599: )
600: {
601: // パラメタの仮定
602: ASSERT( IsValidWindow( hWnd ) );
603:
604: //
605: {for( int i = 0; i < numof( g_ddx ); ++i )
606: {
607: if ( g_ddx[ i ].more == LOWORD( wParam ) )
608: {
609: g_dlg.more ^= g_ddx[ i ].flag;
610: VERIFY( ShowDlgItemGroup( hWnd, g_ddx[ i ].id, 0 != (g_dlg.more & g_ddx[ i ].flag) ) );
611: return true;
612: }
613: }}
614:
615: UNREACHCODE( "g_ddx の抜け?" );
616: return true;
617: }//OnInstallCommandMore
618:
619:
620: //******************************************************************************************************************
621: // WM_SYSCOMMAND
622: //******************************************************************************************************************
623: static INT_PTR OnInstallSystemCommandSetDefault( HWND hWnd );
624: static INT_PTR OnInstallSystemCommandAbout( HWND hWnd );
625: static INT_PTR OnInstallSystemCommandUsePif( HWND hWnd );
626:
627:
628: //*********************************************************
629: // OnInstallSystemCommand - WM_SYSCOMMAND
630: //*********************************************************
631: static
632: INT_PTR
633: OnInstallSystemCommand
634: (
635: HWND hWnd,
636: WPARAM wParam,
637: LPARAM _unuse( lParam )
638: )
639: {
640: // パラメタの仮定
641: ASSERT( IsValidWindow( hWnd ) );
642: ASSERT( IsValidSystemCommandMessageParam( wParam, lParam ) );
643:
644: switch( LOWORD(wParam) )
645: {
646: case IDM_ABOUT: return OnInstallSystemCommandAbout( hWnd );
647: case IDM_SETDEFAULT: return OnInstallSystemCommandSetDefault( hWnd );
648: case IDM_USE_PIF: return OnInstallSystemCommandUsePif( hWnd );
649: default: return false;
650: }
651: }//OnInstallSystemCommand
652:
653: //*********************************************************
654: // OnInstallSystemCommandAbout
655: //*********************************************************
656: static
657: INT_PTR
658: OnInstallSystemCommandAbout
659: (
660: HWND hWnd
661: )
662: {
663: // パラメタの仮定
664: ASSERT( IsValidWindow( hWnd ) );
665:
666: ABOUTBOX_t tmp; // AboutBox のパラメータ
667: tmp.url = URL_WEBPAGE;
668: AboutBox( hWnd, &tmp ); // 「……について」ダイアログを表示する。
669:
670: return true;
671: }//OnInstallSystemCommandAbout
672:
673: //*********************************************************
674: // OnInstallSystemCommandSetDefault
675: //*********************************************************
676: static
677: INT_PTR
678: OnInstallSystemCommandSetDefault
679: (
680: HWND hWnd
681: )
682: {
683: // パラメタの仮定
684: ASSERT( IsValidWindow( hWnd ) );
685:
686: VERIFY( SetInstallDlgData( hWnd, &g_dlg.info ) );
687:
688: //
689: g_dlg.pif = (FLAG_PIF == (FLAG_PIF & g_dlg.info.flags));
690:
691: // OnInstallSystemCommandUsePif(), InitInstallDlgControls() と重複している!
692: // 関数名を考えよう!
693: if ( g_dlg.pif )
694: {
695: VisibleDlgItem( hWnd, IDC_PIF, true );
696: VisibleDlgItem( hWnd, IDC_MORE_PIF, true );
697: }
698: else
699: {
700: VisibleDlgItem( hWnd, IDC_PIF, false );
701: VisibleDlgItem( hWnd, IDC_MORE_PIF, false );
702:
703: if ( FLAG_PIF == (g_dlg.more & FLAG_PIF) )
704: {
705: g_dlg.more ^= FLAG_PIF;
706: VERIFY( ShowDlgItemGroup( hWnd, ID_PIF, FLAG_PIF == (FLAG_PIF & g_dlg.more) ) );
707: }
708: }
709:
710: return true;
711: }//OnInstallSystemCommandSetDefault
712:
713: //*********************************************************
714: // OnInstallSystemCommandUsePif
715: //*********************************************************
716: static
717: INT_PTR
718: OnInstallSystemCommandUsePif
719: (
720: HWND hWnd
721: )
722: {
723: // パラメタの仮定
724: ASSERT( IsValidWindow( hWnd ) );
725:
726: //
727: g_dlg.pif = !g_dlg.pif;
728:
729: // InitInstallDlgControls(), OnInstallSystemCommandSetDefault() と重複している!
730: // 関数名を考えよう!
731: if ( g_dlg.pif )
732: {
733: VisibleDlgItem( hWnd, IDC_PIF, true );
734: VisibleDlgItem( hWnd, IDC_MORE_PIF, true );
735: }
736: else
737: {
738: VisibleDlgItem( hWnd, IDC_PIF, false );
739: VisibleDlgItem( hWnd, IDC_MORE_PIF, false );
740:
741: if ( FLAG_PIF == (g_dlg.more & FLAG_PIF) )
742: {
743: g_dlg.more ^= FLAG_PIF;
744: VERIFY( ShowDlgItemGroup( hWnd, ID_PIF, FLAG_PIF == (FLAG_PIF & g_dlg.more) ) );
745: }
746: }
747:
748: return true;
749: }//OnInstallSystemCommandUsePif
750:
751:
752: //******************************************************************************************************************
753: // OnInstallNotify - WM_NOTIFY
754: //******************************************************************************************************************
755: static INT_PTR OnInstallNotifyVerbList( HWND hWnd, LPARAM lParam );
756: static INT_PTR OnInstallNotifyVerbListDubleClick( HWND hWnd, LPARAM lParam );
757:
758:
759: //*********************************************************
760: // OnInstallNotify
761: //*********************************************************
762: static
763: INT_PTR
764: OnInstallNotify
765: (
766: HWND hWnd,
767: WPARAM wParam,
768: LPARAM lParam
769: )
770: {
771: // パラメタの仮定
772: ASSERT( IsValidWindow( hWnd ) );
773: ASSERT( IsValidPtr( (NMHDR *)lParam, sizeof(NMHDR) ) );
774:
775: {for( int i = 0; i < numof( g_ddx ); ++i )
776: {
777: if ( g_ddx[ i ].list == static_cast<int>( wParam ) )
778: return OnInstallNotifyVerbList( hWnd, lParam );
779: }}
780:
781: return false;
782: }//OnInstallNotify
783:
784: //*********************************************************
785: // OnInstallNotifyVerbList
786: //*********************************************************
787: static
788: INT_PTR
789: OnInstallNotifyVerbList
790: (
791: HWND hWnd,
792: LPARAM lParam
793: )
794: {
795: // パラメタの仮定
796: ASSERT( IsValidWindow( hWnd ) );
797: ASSERT( IsValidPtr( (NMHDR *)lParam, sizeof(NMHDR) ) );
798: ASSERT( IsWindowListViewControl( ((NMHDR *)lParam)->hwndFrom ) );
799:
800: const NMHDR *nmh = (NMHDR *)lParam;
801: switch( nmh->code )
802: {
803: case NM_DBLCLK: return OnInstallNotifyVerbListDubleClick( hWnd, lParam );
804: default: return false;
805: }
806: }//OnInstallNotifyVerbList
807:
808: //*********************************************************
809: // OnInstallNotifyVerbListDubleClick
810: //*********************************************************
811: static
812: INT_PTR
813: OnInstallNotifyVerbListDubleClick
814: (
815: HWND hWnd,
816: LPARAM lParam
817: )
818: {
819: // パラメタの仮定
820: ASSERT( IsValidWindow( hWnd ) );
821: ASSERT( IsValidPtr( (NMHDR *)lParam, sizeof(NMHDR) ) );
822: ASSERT( IsWindowListViewControl( ((NMHDR *)lParam)->hwndFrom ) );
823: ASSERT( NM_DBLCLK == ((NMHDR *)lParam)->code );
824:
825: //
826: const NMHDR *nmh = (NMHDR *)lParam;
827:
828: //
829: {for( int i = 0; i < numof( g_ddx ); ++i )
830: {
831: if ( g_ddx[ i ].list == _w64_static_cast<int>( nmh->idFrom ) ) // _W64
832: {
833: if ( IsValidDlgItem( hWnd, g_ddx[ i ].cmdline ) )
834: {
835: const int index = ListView_GetNextSelectedItem( nmh->hwndFrom, -1 );
836: if ( 0 <= index )
837: {
838: char verb[ 1+MAX_CMDLINE ];
839: ListView_GetItemText( nmh->hwndFrom, index, COLUMN_VERB, verb, numof(verb) );
840:
841: char cmdline[ 1+MAX_CMDLINE ];
842: make_cmdline( cmdline, numof(cmdline), verb );
843: SetDlgItemText( hWnd, g_ddx[ i ].cmdline, cmdline );
844: return true;
845: }
846:
847: // 項目以外を DBLCLICK した
848: char cmdline[ 1+MAX_CMDLINE ];
849: make_cmdline( cmdline, numof(cmdline), null );
850: SetDlgItemText( hWnd, g_ddx[ i ].cmdline, cmdline );
851: return true;
852: }
853: }
854: }}
855:
856: //
857: UNREACHCODE( "g_ddx の抜け?" );
858: return true;
859: }//OnInstallNotifyVerbListDubleClick
860:
861: //******************************************************************************************************************
862: // private - init
863: //******************************************************************************************************************
864: //*********************************************************
865: // InitInstallDlgSystemMenu
866: //*********************************************************
867: static
868: bool
869: InitInstallDlgSystemMenu
870: (
871: HWND hWnd
872: )
873: {
874: // パラメタの仮定
875: ASSERT( IsValidWindow( hWnd ) );
876:
877: HMENU hmenuSystem = GetSystemMenu( hWnd, false );
878: const int pos = GetMenuItemPos( hmenuSystem, SC_ZOOM );
879: if ( 0 <= pos )
880: {
881: const struct
882: {
883: UINT type;
884: UINT id;
885: const char *title;
886: }
887: item[] =
888: {
889: #define MAKE_MENUITEM( type, id, title ) { type, id, title }
890: MAKE_MENUITEM( MF_SEPARATOR, 0, null ),
891: MAKE_MENUITEM( MF_STRING, IDM_SETDEFAULT, "設定を初期値に戻す(&D)" ),
892: MAKE_MENUITEM( MF_STRING, IDM_ABOUT, "About(&A)" ),
893: MAKE_MENUITEM( MF_SEPARATOR, 0, null ),
894: MAKE_MENUITEM( MF_STRING, IDM_USE_PIF, "それでも *.pif ファイルに関連付ける" ),
895: #undef MAKE_MENUITEM
896: };
897: {for( int i = numof( item ); 0 < i; --i )
898: {
899: VERIFY( InsertMenu( hmenuSystem, pos+1, MF_BYPOSITION | item[ i-1 ].type, item[ i-1 ].id, item[ i-1 ].title ) );
900: // Menu_InsertSeparator( hmenuSystem, pos+1, MF_BYPOSITION );
901: }}
902: }
903:
904: return true;
905: }//InitInstallDlgSystemMenu
906:
907:
908: //******************************************************************************************************************
909: // private
910: //******************************************************************************************************************
911: static bool SetInstallDlgDataVerbList( HWND hwndListView, const char *verb );
912:
913:
914: //*********************************************************
915: // ShowDlgItemGroup
916: //*********************************************************
917: static
918: bool
919: ShowDlgItemGroup
920: (
921: HWND hWnd,
922: id_t id,
923: bool bShow
924: )
925: {
926: // パラメタの仮定
927: ASSERT( IsValidWindow( hWnd ) );
928: ASSERT( IS_VALID_ID( id ) );
929:
930: {for( int index = 0; index < numof( g_ddx ); ++index )
931: {
932: if ( id == g_ddx[ index ].id )
933: {
934: //
935: SetDlgItemText( hWnd, g_ddx[ index ].more, bShow ? "<< 詳細" : "詳細 >>" );
936:
937: //
938: {for( int i = 0; i < numof( g_offset ); ++i )
939: {
940: const int ctrl = atoffset( int, &g_ddx[ index ], g_offset[ i ] );
941: if ( (ctrl != g_ddx[ index ].check )
942: && (ctrl != g_ddx[ index ].more) )
943: {
944: if ( IsValidDlgItem( hWnd, ctrl ) )
945: {
946: VisibleDlgItem( hWnd, ctrl, bShow );
947: }
948: }
949: }}
950:
951: //
952: const int sign = bShow ? 1 : -1;
953: const int group_bottom = GetDlgItemBottom( hWnd, g_ddx[ index ].group );
954: const int more_bottom = GetDlgItemBottom( hWnd, g_ddx[ index ].more );
955: const int height = sign * (group_bottom - more_bottom);
956:
957: //
958: {for( int i = 0; i < numof( g_ddx ); ++i )
959: {
960: if ( i != index )
961: {
962: if ( more_bottom < GetDlgItemTop( hWnd, g_ddx[ i ].group ) )
963: {
964: {for( int j = 0; j < numof( g_offset ); ++j )
965: {
966: const int ctrl = atoffset( int, &g_ddx[ i ], g_offset[ j ] );
967: if ( IsValidDlgItem( hWnd, ctrl ) )
968: {
969: ShiftDlgItemPos( hWnd, ctrl, 0, height );
970: }
971: }}
972: }
973: }
974: }}
975:
976: //
977: ShiftDlgItemPos( hWnd, IDOK, 0, height );
978: ShiftDlgItemPos( hWnd, IDCANCEL, 0, height );
979:
980: //
981: g_dlg.szMinSize.cy += height;
982: ShiftWindowSize( hWnd, 0, height );
983: }
984: }}
985:
986: return true;
987: }//ShowDlgItemGroup
988:
989: //*********************************************************
990: // EnableDlgItemGroup
991: //*********************************************************
992: static
993: bool
994: EnableDlgItemGroup
995: (
996: HWND hWnd,
997: id_t id,
998: bool bEnable
999: )
1000: {
1001: // パラメタの仮定
1002: ASSERT( IsValidWindow( hWnd ) );
1003: ASSERT( IS_VALID_ID( id ) );
1004:
1005: //
1006: {for( int index = 0; index < numof( g_ddx ); ++index )
1007: {
1008: if ( id == g_ddx[ index ].id )
1009: {
1010: {for( int i = 0; i < numof( g_offset ); ++i )
1011: {
1012: const int ctrl = atoffset( int, &g_ddx[ index ], g_offset[ i ] );
1013: if ( (ctrl != g_ddx[ index ].check )
1014: && (ctrl != g_ddx[ index ].more) )
1015: {
1016: if ( IsValidDlgItem( hWnd, ctrl ) )
1017: {
1018: EnableDlgItem( hWnd, ctrl, bEnable );
1019: }
1020: }
1021: }}
1022: }
1023: }}
1024:
1025: return true;
1026: }//EnableDlgItemGroup
1027:
1028: //*********************************************************
1029: // GetInstallDlgData
1030: //*********************************************************
1031: static
1032: bool
1033: GetInstallDlgData
1034: (
1035: HWND hWnd,
1036: install_t *info
1037: )
1038: {
1039: // パラメタの仮定
1040: ASSERT( IsValidWindow( hWnd ) );
1041: ASSERT( IsValidPtr( info, sizeof( *info ) ) );
1042: DESTROY_BUFFER( info, sizeof( *info ) ); // [破壊]
1043:
1044: // 関連づけ
1045: info->flags = 0;
1046: {for( int i = 0; i < numof( g_ddx ); ++i )
1047: {
1048: // check
1049: if ( IsValidDlgItem( hWnd, g_ddx[ i ].check ) )
1050: {
1051: if ( BST_CHECKED == IsDlgButtonChecked( hWnd, g_ddx[ i ].check ) )
1052: {
1053: info->flags |= g_ddx[ i ].flag;
1054: }
1055: }
1056:
1057: //
1058: {
1059: ASSERT( IS_VALID_ID( g_ddx[ i ].id ) );
1060: const size_t index = ID_INDEX( g_ddx[ i ].id );
1061: ASSERT( IS_VALID_INDEX( index ) );
1062: relation_t *reg = &info->reg[ index ];
1063:
1064: // default
1065: strcopy( reg->menu, numof(reg->menu), g_dlg.info.reg[ index ].menu );
1066: strcopy( reg->cmdline, numof(reg->cmdline), g_dlg.info.reg[ index ].cmdline );
1067: strcopy( reg->regpath, numof(reg->regpath), g_dlg.info.reg[ index ].regpath );
1068:
1069: // regpath
1070: if ( IsValidDlgItem( hWnd, g_ddx[ i ].reg ) )
1071: {
1072: VERIFY( 0 <= GetDlgItemText( hWnd, g_ddx[ i ].reg, reg->regpath, numof( reg->regpath ) ) );
1073: }
1074: ASSERT( IsValidStringPtr( reg->regpath ) );
1075:
1076: // menu
1077: if ( IsValidDlgItem( hWnd, g_ddx[ i ].menu ) )
1078: {
1079: VERIFY( 0 <= GetDlgItemText( hWnd, g_ddx[ i ].menu, reg->menu, numof( reg->menu ) ) );
1080: }
1081: ASSERT( IsValidStringPtr( reg->menu ) );
1082:
1083: // cmdline
1084: if ( IsValidDlgItem( hWnd, g_ddx[ i ].cmdline ) )
1085: {
1086: VERIFY( 0 <= GetDlgItemText( hWnd, g_ddx[ i ].cmdline, reg->cmdline, numof( reg->cmdline ) ) );
1087: }
1088: ASSERT( IsValidCommandLineString( reg->cmdline ) );
1089: }
1090: }}
1091:
1092:
1093: ASSERT( IsValidInstallInfo( info ) );
1094: return true;
1095: }//GetInstallDlgData
1096:
1097: //*********************************************************
1098: // SetInstallDlgData
1099: //*********************************************************
1100: static
1101: bool
1102: SetInstallDlgData
1103: (
1104: HWND hWnd,
1105: const install_t *info
1106: )
1107: {
1108: // パラメタの仮定
1109: ASSERT( IsValidWindow( hWnd ) );
1110: ASSERT( IsValidInstallInfo( info ) );
1111:
1112: //
1113: {for( int i = 0; i < numof( g_ddx ); ++i )
1114: {
1115: // check
1116: const UINT uCheck = (g_ddx[ i ].flag == (info->flags & g_ddx[ i ].flag)) ? BST_CHECKED : BST_UNCHECKED;
1117: if ( ! IsValidDlgItem( hWnd, g_ddx[ i ].check ) )
1118: {
1119: EnableDlgItemGroup( hWnd, g_ddx[ i ].id, false );
1120: }
1121: else
1122: {
1123: EnableDlgItemGroup( hWnd, g_ddx[ i ].id, BST_CHECKED == uCheck );
1124: CheckDlgButton( hWnd, g_ddx[ i ].check, uCheck );
1125: }
1126:
1127: //
1128: {
1129: ASSERT( IS_VALID_ID( g_ddx[ i ].id ) );
1130: const size_t index = ID_INDEX( g_ddx[ i ].id );
1131: ASSERT( IS_VALID_INDEX( index ) );
1132: const relation_t *reg = &info->reg[ index ];
1133: ASSERT( IsValidStringPtr( reg->menu ) );
1134: ASSERT( IsValidCommandLineString( reg->cmdline ) );
1135:
1136: // regpath
1137: if ( IsValidDlgItem( hWnd, g_ddx[ i ].reg ) )
1138: {
1139: VERIFY( SetDlgItemText( hWnd, g_ddx[ i ].reg, reg->regpath ) );
1140: }
1141:
1142: // menu
1143: if ( IsValidDlgItem( hWnd, g_ddx[ i ].menu ) )
1144: {
1145: VERIFY( SetDlgItemText( hWnd, g_ddx[ i ].menu, reg->menu ) );
1146: }
1147:
1148: // cmdline
1149: if ( IsValidDlgItem( hWnd, g_ddx[ i ].cmdline ) )
1150: {
1151: VERIFY( SetDlgItemText( hWnd, g_ddx[ i ].cmdline, reg->cmdline ) );
1152: }
1153:
1154: // list
1155: if ( IsValidDlgItem( hWnd, g_ddx[ i ].list ) )
1156: {
1157: int argc;
1158: char **argv = argcargv( &argc, reg->cmdline, FLG_ARGCARGV_MSDEFAULT );
1159: if ( argv )
1160: {
1161: //
1162: char verb[ 1+MAX_CMDLINE ];
1163: get_cmdline_option( verb, numof( verb ), argc, argv );
1164:
1165: //
1166: HWND hwndListView = GetDlgItem( hWnd, g_ddx[ i ].list );
1167: VERIFY( SetInstallDlgDataVerbList( hwndListView, verb ) );
1168:
1169: //
1170: free_argcargv( argc, argv );
1171: }
1172: }
1173: }
1174: }}
1175:
1176: return true;
1177: }//SetInstallDlgData
1178:
1179: //*********************************************************
1180: // SetInstallDlgDataVerbList
1181: //*********************************************************
1182: static
1183: bool
1184: SetInstallDlgDataVerbList
1185: (
1186: HWND hwndListView,
1187: const char *verb
1188: )
1189: {
1190: // パラメタの仮定
1191: ASSERT( IsValidWindow( hwndListView ) );
1192: ASSERT( IsValidStringPtr( verb ) );
1193:
1194: int index = -1;
1195: while( -1 != (index = ListView_GetNextItem(hwndListView, index, LVNI_ALL)) )
1196: {
1197: char title[ 1+MAX_CMDLINE ];
1198: ListView_GetItemText( hwndListView, index, COLUMN_VERB, title, numof(title) );
1199:
1200: //
1201: ListView_SetItemState( hwndListView, index, (streql( verb, title ) ? LVIS_SELECTED : 0), LVIS_SELECTED );
1202: }
1203:
1204: return true;
1205: }//SetInstallDlgDataVerbList
1206:
1207:
1208: //******************************************************************************************************************
1209: // private - init controls
1210: //******************************************************************************************************************
1211: static bool InitInstallDlgVerbListView( HWND hwndListView );
1212: static bool ListView_InsertVerb( HWND hwndListView, int index, const char *ver, const char *cmdline );
1213:
1214:
1215: //*********************************************************
1216: // InitInstallDlgControls
1217: //*********************************************************
1218: static
1219: bool
1220: InitInstallDlgControls
1221: (
1222: HWND hWnd,
1223: DWORD more
1224: )
1225: {
1226: // パラメタの仮定
1227: ASSERT( IsValidWindow( hWnd ) );
1228:
1229: //
1230: {for( int i = 0; i < numof( g_ddx ); ++i )
1231: {
1232: //
1233: VERIFY( ShowDlgItemGroup( hWnd, g_ddx[ i ].id, 0 != (more & g_ddx[ i ].flag) ) );
1234:
1235: //
1236: if ( IsValidDlgItem( hWnd, g_ddx[ i ].list ) )
1237: {
1238: HWND hwndVerbListView = GetDlgItem( hWnd, g_ddx[ i ].list );
1239: VERIFY( InitInstallDlgVerbListView( hwndVerbListView ) );
1240: }
1241: }}
1242:
1243: // OnInstallSystemCommandUsePif(), OnInstallSystemCommandSetDefault() と重複している!
1244: // 関数名を考えよう!
1245: if ( g_dlg.pif )
1246: {
1247: VisibleDlgItem( hWnd, IDC_PIF, true );
1248: VisibleDlgItem( hWnd, IDC_MORE_PIF, true );
1249: }
1250: else
1251: {
1252: VisibleDlgItem( hWnd, IDC_PIF, false );
1253: VisibleDlgItem( hWnd, IDC_MORE_PIF, false );
1254:
1255: if ( FLAG_PIF == (g_dlg.more & FLAG_PIF) )
1256: {
1257: g_dlg.more ^= FLAG_PIF;
1258: VERIFY( ShowDlgItemGroup( hWnd, ID_PIF, FLAG_PIF == (FLAG_PIF & g_dlg.more) ) );
1259: }
1260: }
1261:
1262: return true;
1263: }//InitInstallDlgControls
1264:
1265: //*********************************************************
1266: // InitInstallDlgVerbListView
1267: //*********************************************************
1268: static
1269: bool
1270: InitInstallDlgVerbListView
1271: (
1272: HWND hwndListView
1273: )
1274: {
1275: // パラメタの仮定
1276: ASSERT( IsWindowListViewControl( hwndListView ) );
1277:
1278: //
1279: ListView_SetExtendedStyle( hwndListView, LVS_EX_FULLROWSELECT );
1280: ListView_InsertNewColumn( hwndListView, COLUMN_VERB, LVCF_FMT, LVCFMT_LEFT, COLUMN_WIDTH_VERB, COLUMN_TITLE_VERB );
1281: ListView_InsertNewColumn( hwndListView, COLUMN_CMDLINE, LVCF_FMT, LVCFMT_LEFT, COLUMN_WIDTH_CMDLINE, COLUMN_TITLE_CMDLINE );
1282:
1283: // フォルダに関連付けられた動詞を列挙
1284: {
1285: HKEY hregShell;
1286: if ( OpenShellRegKey( REG_CLS_FOLDER, &hregShell ) )
1287: {
1288: char verb[ 1+MAX_CMDLINE ];
1289: {for( DWORD index = 0; EnumRegKey( hregShell, index, verb, numof(verb) ); ++index )
1290: {
1291: HKEY hregVerb;
1292: if ( OpenRegKey( hregShell, verb, KEY_ALL_ACCESS, &hregVerb ) )
1293: {
1294: HKEY hregCommand;
1295: if ( OpenRegKey( hregVerb, REG_KEYNAME_COMMAND, KEY_ALL_ACCESS, &hregCommand ) )
1296: {
1297: char cmdln[ 1+MAX_CMDLINE ];
1298: if ( GetRegKeyString( hregCommand, null, cmdln, numof(cmdln) ) )
1299: {
1300: VERIFY( ListView_InsertVerb( hwndListView, 0, verb, cmdln ) );
1301: }
1302: VERIFY( CloseRegKey( hregCommand ) );
1303: }
1304: VERIFY( CloseRegKey( hregVerb ) );
1305: }
1306: }}
1307: VERIFY( CloseRegKey( hregShell ) );
1308: }
1309: }
1310:
1311: return true;
1312: }//InitInstallDlgVerbListView
1313:
1314: //*********************************************************
1315: // ListView_InsertVerb
1316: //*********************************************************
1317: static
1318: bool
1319: ListView_InsertVerb
1320: (
1321: HWND hwndListView,
1322: int index,
1323: const char *verb,
1324: const char *cmdln
1325: )
1326: {
1327: // パラメタの仮定
1328: ASSERT( 0 <= index );
1329: ASSERT( IsWindowListViewControl( hwndListView ) );
1330: ASSERT( IsValidStringPtr( verb ) );
1331: ASSERT( IsValidStringPtr( cmdln ) );
1332:
1333: LVITEM lvItem;
1334: lvItem.mask = 0;
1335: lvItem.iItem = index;
1336: lvItem.iSubItem = 0;
1337: ListView_InsertItem( hwndListView, &lvItem );
1338: ListView_SetItemText( hwndListView, index, COLUMN_VERB, const_cast<char *>( verb ) );
1339: ListView_SetItemText( hwndListView, index, COLUMN_CMDLINE, const_cast<char *>( cmdln ) );
1340:
1341: return true;
1342: }//ListView_InsertVerb
1343:
1344: //*********************************************************
1345: // ListView_GetNextSelectedItem
1346: //*********************************************************
1347: static
1348: int
1349: ListView_GetNextSelectedItem
1350: (
1351: HWND hwndListView,
1352: int index
1353: )
1354: {
1355: // パラメタの仮定
1356: ASSERT( IsWindowListViewControl( hwndListView ) );
1357:
1358: return ListView_GetNextItem( hwndListView, index, LVNI_ALL | LVNI_SELECTED );
1359: }//ListView_GetNextSelectedItem
1360:
1361:
1362: //******************************************************************************************************************
1363: // TEST
1364: //******************************************************************************************************************
1365:
1366:
1367: #ifdef _DEBUG // デバッグ時のみ
1368:
1369:
1370: //*********************************************************
1371: // test_InstallDlg
1372: //*********************************************************
1373: DEFINE_TESTPROC( test_InstallDlg )
1374: {
1375: //---------------------------------------------------------
1376: // 定数 の テスト
1377: //---------------------------------------------------------
1378:
1379: // g_offset の 重複
1380: {for( int i = 0; i < numof( g_offset ) - 1; ++i )
1381: {
1382: {for( int j = i+1; j < numof( g_offset ); ++j )
1383: {
1384: ASSERT( i != j );
1385: ASSERT( g_offset[ i ] != g_offset[ j ] );
1386: }}
1387: }}
1388:
1389: // g_ddx の 範囲
1390: {for( int i = 0; i < numof( g_ddx ); ++i )
1391: {
1392: ASSERT( IS_VALID_ID( g_ddx[ i ].id ) );
1393: // ASSERT( (0 <= g_ddx[i].id) && (g_ddx[i].id < numof( ((install_t *)null)->reg )) );
1394: }}
1395:
1396: // g_ddx の 重複
1397: {for( int i = 0; i < numof( g_ddx ) - 1; ++i )
1398: {
1399: {for( int j = i+1; j < numof( g_ddx ); ++j )
1400: {
1401: ASSERT( i != j );
1402: ASSERT( g_ddx[ i ].id != g_ddx[ j ].id );
1403: ASSERT( 0 == (g_ddx[ i ].flag & g_ddx[ j ].flag) );
1404:
1405: {for( int k = 0; k < numof( g_offset ); ++k )
1406: {
1407: const int ctrl_i = atoffset( int, &g_ddx[ i ], g_offset[ k ] );
1408: const int ctrl_j = atoffset( int, &g_ddx[ j ], g_offset[ k ] );
1409: ASSERT( ctrl_i != ctrl_j );
1410: }}
1411: }}
1412: }}
1413:
1414:
1415: //---------------------------------------------------------
1416: // ファイルスコープ関数 の テスト
1417: //---------------------------------------------------------
1418:
1419: //---------------------------------------------------------
1420: // 公開関数 の テスト
1421: //---------------------------------------------------------
1422:
1423: }//test_InstallDlg
1424:
1425:
1426: #endif // #ifdef _DEBUG
1427:
1428:
1429: //** end **
参照:
水無瀬の部屋 > sample > atlnk > custom.cpp |
---|
このページは cpp2web が出力しました。
水無瀬 優 postmaster@katsura-kotonoha.sakura.ne.jp
http://katsura-kotonoha.sakura.ne.jp/prog/code/atlnk/custom_cpp.shtml